import sqlite3
import sys
from os_package import Os_Option


class Sqlite_Option(object):
    """
    一个用于管理 SQLite 数据库操作的类
    """

    def __init__(self, db_file=None):
        """
        初始化类，连接到指定的数据库文件

        参数:
        db_file (str): 数据库文件的路径
        """
        os_option = Os_Option()

        if not os_option.get_isexist("db"):
            os_option.make_file_folder("db")

        if db_file is None:
            db_file = f'./db/{os_option.get_file_name_and_extension(sys.argv[0])[0]}.db'

        del os_option
        self.conn = sqlite3.connect(db_file)
        self.cursor = self.conn.cursor()

    def __del__(self):
        self.close_connection()

    def create_table(self, table_name, columns):
        """
        创建新的表

        参数:
        table_name (str): 表的名称
        columns (str): 包含列定义的字符串，例如 "id INT PRIMARY KEY, name TEXT"
        """
        query = f"CREATE TABLE IF NOT EXISTS {table_name} ({columns})"
        self.cursor.execute(query)
        self.conn.commit()

    def drop_table(self, table_name):
        """
        删除表

        参数:
        table_name (str): 要删除的表的名称
        """
        query = f"DROP TABLE IF EXISTS {table_name}"
        self.cursor.execute(query)
        self.conn.commit()

    def insert_row(self, table_name, data):
        """
        插入指定表中的单行数据

        参数:
        table_name (str): 要插入数据的表名
        data (dict): 包含列名和对应值的字典
        """
        columns = ', '.join(data.keys())
        placeholders = ', '.join(['?'] * len(data))
        values = tuple(data.values())
        query = f"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})"
        self.cursor.execute(query, values)
        self.conn.commit()

    def delete_row(self, table_name, condition):
        """
        删除指定表中的单行数据

        参数:
        table_name (str): 要操作的表名
        condition (str): 删除的条件，例如 "id = 5"
        """
        query = f"DELETE FROM {table_name} WHERE {condition}"
        self.cursor.execute(query)
        self.conn.commit()

    def update_row(self, table_name, data, condition):
        """
        更新指定表中的指定行数据

        参数:
        table_name (str): 要操作的表名
        data (dict): 包含要更新的列名和对应值的字典
        condition (str): 更新的条件，例如 "id = 5"
        """
        set_statements = ', '.join([f"{col} =?" for col in data])
        values = tuple(data.values()) + (condition,)
        query = f"UPDATE {table_name} SET {set_statements} WHERE {condition}"
        self.cursor.execute(query, values)
        self.conn.commit()

    def get_row(self, table_name, condition):
        """
        获取指定表中的指定行数据

        参数:
        table_name (str): 要操作的表名
        condition (str): 获取的条件，例如 "id = 5"
        """
        query = f"SELECT * FROM {table_name} WHERE {condition}"
        self.cursor.execute(query)
        return self.cursor.fetchone()

    def get_all_rows(self, table_name):
        """
        获取指定表中的全部行数据

        参数:
        table_name (str): 要操作的表名
        """
        query = f"SELECT * FROM {table_name}"
        self.cursor.execute(query)
        return self.cursor.fetchall()

    def rename_column(self, table_name, old_column_name, new_column_name):
        """
        更改指定表中的指定列名

        参数:
        table_name (str): 要操作的表名
        old_column_name (str): 原列名
        new_column_name (str): 新列名
        """
        query = f"ALTER TABLE {table_name} RENAME COLUMN {old_column_name} TO {new_column_name}"
        self.cursor.execute(query)
        self.conn.commit()

    def drop_column(self, table_name, column_name):
        """
        删除指定表中的指定列名

        参数:
        table_name (str): 要操作的表名
        column_name (str): 要删除的列名
        """
        query = f"ALTER TABLE {table_name} DROP COLUMN {column_name}"
        self.cursor.execute(query)
        self.conn.commit()

    def get_all_column_names(self, table_name):
        """
        获取指定表中的全部列名

        参数:
        table_name (str): 要操作的表名
        """
        query = f"PRAGMA table_info({table_name})"
        self.cursor.execute(query)
        columns = [column[1] for column in self.cursor.fetchall()]
        return columns

    def add_column(self, table_name, column_name, column_type):
        """
        新增指定表中的列名

        参数:
        table_name (str): 要操作的表名
        column_name (str): 新列名
        column_type (str): 新列的数据类型
        """
        query = f"ALTER TABLE {table_name} ADD COLUMN {column_name} {column_type}"
        self.cursor.execute(query)
        self.conn.commit()

    def close_connection(self):
        """
        关闭数据库连接
        """
        self.conn.close()
